package codificacaojava;

import java.io.File;
import java.io.IOException;
import javax.swing.JFileChooser;

// ===============================================================================
/**
 * A classe Frequencia lê o arquivo *.seq e contabiliza, por meio do programa count.pl, a freqüência 
 * de cada um dos bigrams inseridos na seqüência de nucleotídeos desse arquivo. Posteriomente, gera 
 * uma saída no formato *.frq.
 * nome_arquivo.seq ==> nome_arquivo.frq
 * @author Susan Higashi
 */
// ===============================================================================
public class Frequencia 
{
    /**
     * Apresenta a caixa de diálogo para selecionar os arquivos contendo as proteínas
     * que serão calculadas as freqüências e o diretório de destino dos arquivos 
     * processados. 
     *  
     * Executa o programa 'count.pl' do NSP (Ngram Statistics Package) para 
     * todos os arquivos selecionados. 
     * 
     */
    public static void main(String[] args) throws IOException 
    {
        Utilitario util = new Utilitario();
        String so = util.getSO();

        //SELECIONA ARQUIVOS PARA SEREM PROCESSADOS 
        JFileChooser arqSel = new JFileChooser(System.getProperties().getProperty("user.dir"));
        arqSel.setFileSelectionMode(JFileChooser.FILES_ONLY);
        arqSel.setMultiSelectionEnabled(true);
        arqSel.setDialogTitle("Selecione os arquivos que contém as seqüências de nucleotídeos (*.seq)");
        arqSel.addChoosableFileFilter(new  FiltroSequencia());

        int result = arqSel.showOpenDialog(arqSel);

        if (result==JFileChooser.CANCEL_OPTION) System.exit(1);	// caso o usuario clique em 'cancel'

        File arquivos[] = arqSel.getSelectedFiles();		// recebe o arquivo selecionado
        
        //SELECIONA O DIRETORIO DE DESTINO
        JFileChooser destSel = new JFileChooser(System.getProperties().getProperty("user.dir"));
        destSel.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
        destSel.setDialogTitle("Selecione o diretório de destino dos arquivos de freqüência");

        int resultDir = destSel.showOpenDialog(destSel);

        if (resultDir==JFileChooser.CANCEL_OPTION) System.exit(1);	// caso o usuario clique em 'cancel'

        File diretorio = destSel.getSelectedFile();			// recebe o arquivo selecionado 
        
        // COMECA A CONTAR O TEMPO APOS SELECAO DO ARQUIVO E DIRETORIO DESTINO
        long initialTime = System.currentTimeMillis();

        String arquivoOrigem, arquivoDestino, arqOrigemSemExtensao, comando; 

        //PROCESSA TODOS OS ARQUIVOS SELECIONADOS
        for (int i=0; i < arquivos.length; i++)
        {
            arquivoOrigem = arquivos[i].getPath();
            
            int idFim = arquivos[i].getName().indexOf(".");
            arqOrigemSemExtensao = arquivos[i].getName().substring(0, idFim);

            if (so.equals("windows"))	arquivoDestino = diretorio.getPath()+ "\\" + arqOrigemSemExtensao+".frq";
            else 			arquivoDestino = diretorio.getPath()+"/"+arqOrigemSemExtensao+".frq";

            //executa count.pl que contabiliza as frequencias de cada bigram 
	    //count.pl faz parte do NSP (Ngram Statistics Package) http://www.d.umn.edu/~tpederse/nsp.html
            comando = "perl :/media/files/susan/uel/tcc_estagio/dev/mlp/trunk/codificacaojava/src/codificacaojava/count.pl " + arquivoDestino + " " + arquivoOrigem; // linux
            //comando = "perl C:\\count.pl " + arquivoDestino + " " + arquivoOrigem; // windows

            Runtime.getRuntime().exec(comando);
        }

        float totalTime = ((float) (System.currentTimeMillis() - initialTime)) / 1000;

        System.out.println(totalTime + " segundos");
    }
}
// ===============================================================================
/**
 * A classe FiltroSequencia extende a classe abstrata 
 * javax.swing.filechooser.FileFilter e filtra os tipos de arquivos 
 * aceitos, nesse caso arquivos *.seq.
 */
// ===============================================================================
class FiltroSequencia extends javax.swing.filechooser.FileFilter
{
    /**
     * Exibe apenas os arquivos definidos nesse filtro.
     * Método declarado  na classe abstrata FileFilter. 
     * @param file arquivo a ser filtrado. 
     */
    public boolean accept(File file) 
    {
        if(file.isDirectory()) return true;
  
        String fileName = file.getName();
        
        if(fileName.endsWith(".seq")) return true;
        
        return false;
    }

    /**
     * Descrição do filtro. 
     * Método declarado na classe abstrata. 
     */
    public String getDescription()
    {
        return "Arquivos de Seqüência (*.seq)";
    }    
}
